#include <stdio.h>
#include <stdlib.h>//包含了exit函数
#include <malloc.h>//包含了malloc函数

//定义了一个数据类型，该数据类型名字叫做 struct Arr，
//该数据类型含有三个成员，分别是pBase，len，cnt
struct Arr                    
{
	int* pBase;     //存储的是数组第一个元素的地址
	int len;        //数组所能容纳的最大元素的个数
	int cnt;        //当前数组有效元素的个数
	int increment;  //自动增长因子
};

void init_arr(struct Arr *pArr,int length);//初始化
bool append_arr(struct Arr *pArr, int val);//追加
bool intsert_arr(struct Arr *pArr, int pos,int val);//插入元素
bool delete_arr(struct Arr *pArr,int pos,int *pVal);//销毁
int get();//获取
bool is_empty(struct Arr *pArr);//判空
bool is_full(struct Arr *pArr);//判满
void sort_arr(struct Arr *pArr);//排序(冒泡排序，升序)
void show_arr(struct Arr *pArr);//打印
void inversion_arr(struct Arr *pArr);//倒置


int main(void)
{
	struct Arr arr;
	int val;

	init_arr(&arr,7);//初始化
	show_arr(&arr);

    append_arr(&arr, 1);//追加
	append_arr(&arr, 2);//追加
	append_arr(&arr, 3);//追加
	append_arr(&arr, 4);//追加
	append_arr(&arr, 5);//追加
	append_arr(&arr, 6);//追加
	show_arr(&arr);

	intsert_arr(&arr, 3, 9);//插入元素
	show_arr(&arr);

	delete_arr(&arr, 3, &val);//删除元素
	show_arr(&arr);

	inversion_arr(&arr);//倒置
	show_arr(&arr);

	sort_arr(&arr);//排序
	show_arr(&arr);

	return 0;
}

//初始化
void init_arr(struct Arr *pArr,int length)
{
	pArr->pBase = (int*)malloc(sizeof(int) * length);
	if (NULL == pArr->pBase)
	{
		printf("动态内存分配失败！\n");
		printf("\n");
		exit(-1);//终止整个程序
	}
	else
	{
		pArr->len = length;
		pArr->cnt = 0;
	}
	return;
}

//追加
bool append_arr(struct Arr *pArr, int val)
{
	if (is_full(pArr))//考虑内存已满的情况
	{
		printf("内存空间已满，追加失败！");
		printf("\n");
		return false;
	}
	//内存未满时追加
	pArr->pBase[pArr->cnt] = val;
	(pArr->cnt)++;
	return true;
}

//插入元素
bool intsert_arr(struct Arr *pArr,int pos,int val)
{
	int i = 0;
	if (is_full(pArr))//考虑空间已满的情况
	{
		printf("内存空间已满，插入失败！\n");
		printf("\n");
		return false;
	}
	else if (pos < 1 || pos > pArr->cnt + 1)//考虑插入元素下标pos为非法值的情况
	{
		printf("插入元素下标为非法值！请重试\n");
		printf("\n");
		return false;
	}
	else
	{
		printf("插入元素成功！\n");
		for (i = pArr->cnt - 1; i >= pos - 1; --i)
		{
			pArr->pBase[i + 1] = pArr->pBase[i];
		}
		pArr->pBase[pos - 1] = val;
		(pArr->cnt)++;

		return true;
	}
}

//删除
bool delete_arr(struct Arr *pArr, int pos, int* pVal)
{
	int i = 0;

	if (is_empty(pArr))//考虑空间已满的情况
	{
		printf("数组为空，删除失败！");
		return false;
	}
	else if (pos<1 || pos>pArr->cnt)//考虑删除元素下标pos为非法值的情况
	{
		printf("删除元素下标为非法值，删除失败！");
		return false;
	}
	else
	{
		*pVal = pArr->pBase[pos - 1];
		printf("删除元素成功！\n");
		printf("您要删除的元素为：%d\n", *pVal);

		for (i = pos; i < pArr->cnt; ++i)
		{
			pArr->pBase[i - 1] = pArr->pBase[i];
		}
		pArr->cnt--;

		return true;
	}
}

//int get()//获取
//{
//
//}

//判空
bool is_empty(struct Arr *pArr)
{
	if (0 == pArr->cnt)
	{
		return true;
	}
	else
	{
		return false;
	}
}

//判满
bool is_full(struct Arr *pArr)
{
	if (pArr->cnt == pArr->len)
	{
		return true;
	}
	else
	{
		return false;
	}
}

//排序(冒泡排序，升序)
void sort_arr(struct Arr* pArr)//排序
{
	
	int i = 0, j = 0, t = 0;
	for (i = 0; i < pArr->cnt; ++i)
	{
		for (j = i + 1; j < pArr->cnt; ++j)
		{
			if (pArr->pBase[i] > pArr->pBase[j])
			{
				t = pArr->pBase[i];
				pArr->pBase[i] = pArr->pBase[j];
				pArr->pBase[j] = t;
			}
		}
	}
	printf("排序成功！\n");

	return;
}

//打印
void show_arr(struct Arr *pArr)
{
	if (is_empty(pArr))//判空
	{
		printf("数组为空！\n");
		printf("\n");
	}
	else//输出有效内容
	{
		for (int i = 0; i < pArr->cnt; ++i)
		{
			printf("%d ", pArr->pBase[i]);
		}
		printf("\n\n");
	}
}

//倒置
void inversion_arr(struct Arr* pArr)
{
	int i = 0; 
	int j = pArr->cnt - 1;
	int t = 0;//中间变量

	while (i < j)
	{
		 t= pArr->pBase[i];
		 pArr->pBase[i] = pArr->pBase[j];
		 pArr->pBase[j] = t;
		 ++i, --j;
	}
	printf("倒置成功！\n");

	return;
}